iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Python

探索 Python 世界:從語法基礎到圖像魔法系列 第 15

探索 Python 世界:從語法基礎到圖像魔法 Day15

  • 分享至 

  • xImage
  •  

函式編輯工具裝飾器(Decorator)

語法糖

使用@語法糖,可以直接在函數或方法定義上方添加裝飾器,藉此表示出函式應用的附加功能
例:@dec等價於func = dec(func),這可以讓程式內容更加直觀,且具可讀性

裝飾器(Decorator)

裝飾器也是一種函式,它可以接受函式作為參數、可以把接收到的函式內部處理後再回傳一個新的值,也能再補改變函式的情況添加一些新功能

那裝飾器是在裝飾什麼?

裝飾器是一種設計模式,它可以簡化函式中相同的條件判斷並重複使用,大概就是可以把已存在的函式添加額外的功能

裝飾器(Decorator)範例及實作

範例:

def example_c(f):
    def wrapper(*args, **kwargs):
        print("Step 1") 
        result = f(*args, **kwargs)
        print("Step 3")
        return result
    return wrapper

@example_c #用example_c裝飾example_a函式,相當於example_a = example_c(example_a),因此example_a被呼叫時,引用的是wrapper函式
def example_a(*args, **kwargs): #可接受任意數量的參數
    print("Step 2")
    return 0 

# 呼叫 example_a 函數
example_a()

example_a(),因為example_a()被@example_c裝飾(包起來),因此實際上調用的函式是wrapper(*args, **kwargs),而進入wrapper函式後會先列印出Step 1,在調用並執行原本的example_a函式f(*args, **kwargs),列印Step 2,控制權回到wrapper再列印Step 3,最後wrapper函數回傳None

輸出結果:
image

簡單計算機實作:

def dec(f):
    def wrapper(*args, **kwargs):
        if kwargs.get('operation') not in  ['+', '-', '*', '/']:
            print('運算元有誤無法運算')
            return
        return f(*args, **kwargs)
    return wrapper

@dec
def calculator(*args, **kwargs):
    operation = kwargs.get('operation')
    if operation == '+':
        n = 0
        for num in args:
            n += num
        return n
    elif operation == '-':
        n = 0
        for num in args:
            n -= num
        return n
    elif operation == '/':
        n = args[0]
        for num in args[1:]:
            n /= num
        return n
    elif operation == '*':
        n = args[0]
        for num in args:
            n *= num
        return n
#s = +, -, *, /

print(f'連加={calculator(1, 3, 5, 7, 9, operation = '+')}, \
    連減={calculator(3, 5, 7, 9, operation = '-')}, \
    連乘={calculator(5, 7, 9, operation = '*')}, \
    連除={calculator(100, 5, 2,operation = '/')}')

載入欲計算值後,將會先執行wrapper內的判斷式,若運算原有誤,則列印'運算元有誤',並回傳None,若符合條件則回到calculator函式,並判斷要使用何種運算方式,因為wrapper、calculater皆使用*args, **kwargs因此輸入任意數量的參數皆可運算

輸出結果:
image

參考資料:
https://zh.wikipedia.org/zh-tw/%E8%AF%AD%E6%B3%95%E7%B3%96

https://medium.com/citycoddee/python%E9%80%B2%E9%9A%8E%E6%8A%80%E5%B7%A7-3-%E7%A5%9E%E5%A5%87%E5%8F%88%E7%BE%8E%E5%A5%BD%E7%9A%84-decorator-%E5%97%B7%E5%97%9A-6559edc87bc0

https://medium.com/%E7%A8%8B%E5%BC%8F%E6%84%9B%E5%A5%BD%E8%80%85/%E4%BB%80%E9%BA%BC%E6%98%AF%E8%A3%9D%E9%A3%BE%E5%99%A8-decorator-a344ac5b47c0

https://docs.python.org/zh-tw/3/tutorial/index.html


上一篇
探索 Python 世界:從語法基礎到圖像魔法 Day14
下一篇
探索 Python 世界:從語法基礎到圖像魔法 Day16
系列文
探索 Python 世界:從語法基礎到圖像魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言